package com.wjw.java.basic.convert_;

/**
 * -------------------------------------------------------------------
 * 二进制(BIN)：0到1;满2进1;以0b或0B开头
 * 八进制(OCT)：0到7;满8进1;以0开头
 * 十进制(DEC)：0到9;满10进1
 * 十六进制(HEX)：0到9及A(10)到F(15);满16进1;以0x或0X开头,此处A到F不区分大小写
 * -------------------------------------------------------------------
 * 1.二进制、八进制、十六进制：转为十进制
 * 2.十进制转为:二进制、八进制、十六进制
 * 3.二进制转为：八进制、十六进制
 * 4.八进制、十六进制转为：二进制
 * -------------------------------------------------------------------
 * 注1：
 * 一个数除以另一个数，要是比另一个数小的话，商为0，余数就是它自己
 * 如：1除以2,1比2小,商为0,余数为1
 * -------------------------------------------------------------------
 * 注2：
 * 十进制   0   1    2    3    4    5    6    7    8    9
 * 二进制 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001
 *
 * 位数从低位开始(从右往左)
 * 第一位1表示十进制的：1
 * 第二位1表示十进制的：2
 * 第三位1表示十进制的：4
 * 第四位1表示十进制的：8
 * ...
 * -------------------------------------------------------------------
 */
public class ConvertBinary {

    public static void main(String[] args) {
        //binary();
        System.out.println("-----------------------------------------------------");
        //1
        binary2_to_10();
        binary8_to_10();
        binary16_to_10();
        System.out.println("-----------------------------------------------------");
        //2.
        binary10_to_2();
        binary10_to_8();
        binary10_to_16();
        System.out.println("-----------------------------------------------------");
        //3.
        binary2_to_8();
        binary2_to_16();
        System.out.println("-----------------------------------------------------");
        //4.
        binary8_to_2();
        binary16_to_2();
        System.out.println("-----------------------------------------------------");
    }

    /**
     * 0.输出2、8、10、16进制所对应的10进制结果
     */
    public static void binary(){
        int bin2 = 0b1010;//二进制
        int bin8 = 01010;//八进制
        int bin10 = 1010;//十进制
        int bin16 = 0x10101;//十六进制
        System.out.println(bin2);
        System.out.println(bin8);
        System.out.println(bin10);
        System.out.println(bin16);
    }

    /**
     * 1.1二进制转十进制：公式如下
     * 从最低位(右边)开始,将每个位上的数字提取出来,然后分别乘以2的(位数-1)次方,求和
     */
    public static void binary2_to_10(){
        //从由往左,第一位1,第二为1,第3位0,第四为1
        //1*2(1-1) = 1*2的0次方(任何数的0次方都为1) = 1*1 = 1
        //1*2(2-1) = 1*2的1次方 = 1*2 = 2
        //0*2(3-1) = 0
        //1*2(4-1) = 1*2的3次方 = 8
        //0b1011 = 1 + 2 + 0 + 8
        int bin2 = 0b1011;//11
        System.out.println("二进制的:0b1011转为十进制,结果为:"+bin2);
    }

    /**
     * 1.2八进制转十进制：公式如下
     * 从最低位(右边)开始,将每个位上的数字提取出来,然后分别乘以8的(位数-1)次方,求和
     */
    public static void binary8_to_10(){
        //从由往左,第一位4,第二为3,第3位2
        //4*8(1-1) = 4*8的0次方(任何数的0次方都为1) = 4*2 = 4
        //3*8(2-1) = 3*8的1次方 = 3*8 = 24
        //2*8(3-1) = 2*8的2次方 = 2*64 = 128
        //0234 = 4 + 24 + 128
        int bin8 = 0234;//156
        System.out.println("八进制的:0234转为十进制,结果为:"+bin8);
    }

    /**
     * 1.3八进制转十进制：公式如下
     * 从最低位(右边)开始,将每个位上的数字提取出来,然后分别乘以16的(位数-1)次方,求和
     */
    public static void binary16_to_10(){
        //从由往左,第一位a(10),第二为3,第3位2
        //10*16(1-1) = 10*16的0次方(任何数的0次方都为1) = 10*1 = 10
        //3*16(2-1) = 3*16的1次方 = 3*16 = 48
        //2*16(3-1) = 2*16的2次方 = 2*256 = 512
        //0234 = 10 + 48 + 512
        int bin16 = 0x23a;//570
        System.out.println("十六进制的:0x23a转为十进制,结果为:"+bin16);
    }

    /**
     * 2.1十进制转二进制：公式如下
     * 将该数不断除以2,直到商为0为止,然后将每步得到的余数倒过来,就是对应的二进制
     */
    public static void binary10_to_2(){
        //将十进制的34转为2进制
        /**
         *        34
         *  除以  商为   余数
         *  2     17     0
         *  2     8      1
         *  2     4      0
         *  2     2      0
         *  2     1      0
         *        0      1
         * ---------------------------------------------------------------------
         * 将每步得到的余数倒过来为：100010
         * 1byte(字节) = 8bit(为位),34转为2进制只占了6位,所以前面两位需要用0进行填充
         * 即 0B00100010
         * ---------------------------------------------------------------------
         */
        int bin2 = 0B00100010;
        System.out.println("十进制的:"+bin2+"转为二进制,结果为:0B00100010");
    }

    /**
     * 2.2十进制转八进制：公式如下
     * 将该数不断除以8,直到商为0为止,然后将每步得到的余数倒过来,就是对应的二进制
     */
    public static void binary10_to_8(){
        //将十进制的131转为8进制
        /**
         *        131
         *  除以  商为   余数
         *  8     16     3
         *  8     2      0
         *        0      2
         * ---------------------------------------------------------------------
         * 将每步得到的余数倒过来为：203
         * ---------------------------------------------------------------------
         */
        int bin8 = 0203;
        System.out.println("十进制的:"+bin8+"转为八进制,结果为:0203");
    }

    /**
     * 2.3十进制转十六进制：公式如下
     * 将该数不断除以16,直到商为0为止,然后将每步得到的余数倒过来,就是对应的二进制
     */
    public static void binary10_to_16(){
        //将十进制的237转为16进制
        /**
         *        237
         *  除以  商为   余数
         *  16    14     13(d)
         *        0      14(e)
         * ---------------------------------------------------------------------
         * 将每步得到的余数倒过来为：ed
         * ---------------------------------------------------------------------
         */
        int bin16 = 0xed;
        System.out.println("十进制的:"+bin16+"转为八进制,结果为:0xed");
    }

    /**
     * 3.1二进制转为八进制：公式如下
     * 从低位开始(从由往左),将二进制数每三位分成一组,
     * 每一组转为10进制的数,然后顺序组成就是对应的八进制
     */
    public static void binary2_to_8(){
        //将二进制的ob11010101转为8进制
        /**
         * 详解见注2
         * 11     010     101
         * 3      2        5
         * ---------------------------------------------------------------------
         * 顺序组成结果为：0325
         * ---------------------------------------------------------------------
         */
        System.out.println("二进制的：ob11010101转为八进制,结果为：0325");
    }

    /**
     * 3.2二进制转为十六进制：公式如下
     * 从低位开始(从由往左),将二进制数每四位分成一组,
     * 每一组转为10进制的数,然后顺序组成就是对应的十六进制
     */
    public static void binary2_to_16(){
        //将二进制的ob11010101转为16进制
        /**
         * 详解见注2
         * 1101     0101
         * 13(d)      5
         * ---------------------------------------------------------------------
         * 顺序组成结果为：0xd5
         * ---------------------------------------------------------------------
         */
        System.out.println("二进制的：ob11010101转为十六进制,结果为：0xd5");
    }

    /**
     * 4.1八进制转为二进制：公式如下
     * 将八进制数每一位,转成对应的一个三位的二进制数即可
     */
    public static void binary8_to_2(){
        //将八进制的0327转为2进制
        /**
         * 0      3      2      7
         * 000   011    010    111
         * ---------------------------------------------------------------------
         * 顺序组成结果为：0b11010111
         * ---------------------------------------------------------------------
         */
        System.out.println("八进制的：0327转为二进制,结果为：0b11010111");
    }

    /**
     * 4.2十六进制转为二进制：公式如下
     * 将十六进制数每一位,转成对应的一个四位的二进制数即可
     */
    public static void binary16_to_2(){
        //将十六进制的0x23b转为2进制
        /**
         *  2       3      b(11)
         * 0010    0011    1011
         * ---------------------------------------------------------------------
         * 顺序组成结果为：0b001000111011
         * ---------------------------------------------------------------------
         */
        int s = 0b001000111011;
        System.out.println("十六进制的：0x23b转为二进制,结果为：0b001000111011");
    }
}
